package net.comfycastle.musicplayer;

import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.view.View;
import android.widget.ListView;

/**
 * 곡들의 목록을 나타내는 Fragment
 * @author ricale
 *
 */
public class SongListFragment extends BaseListFragment {
	///////////
	//////////
	/////////   constant
	
	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 프래그먼트 아이디의 키값 */
	private static final String KEY_ID   = "FragSongList.keyId";
	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 곡 분류 기준의 키값 */
	private static final String KEY_KIND = "FragSongList.keyKind";
	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 곡 분류 기준값의 키값 */
	private static final String KEY_NAME = "FragSongList.keyName";
	
	/** 액티비티 제목 설정 시 필요한 문자열을 반환할 때 포함되는 문자열 상수 */
	private static final String FORTITLE_ARTIST = "아티스트: ";
	/** 액티비티 제목 설정 시 필요한 문자열을 반환할 때 포함되는 문자열 상수 */
	private static final String FORTITLE_GENRE = "장르: ";
	/** 액티비티 제목 설정 시 필요한 문자열을 반환할 때 포함되는 문자열 상수 */
	private static final String FORTITLE_COMPOSER = "작곡가: ";
	/** 액티비티 제목 설정 시 필요한 문자열을 반환할 때 포함되는 문자열 상수 */
	private static final String FORTITLE_ALLSONG = "전 곡";
	
	///////////
	//////////
	/////////   constructor
	
	/**
	 * FragSongList.newInstance(fragmentId, "", "")를 호출한다.
	 * @param fragmentId 생성될 인스턴스의 고유 아이디
	 * @return FragSongList의 인스턴스
	 */
	public static SongListFragment newInstance(OBJECTID id) {
		return newInstance(id, "", "");
	} // end newInstance(FragmentId)

	/**
	 * FragSongList의 인스턴스를 생성/반환하는 정적 메소드
	 * 인자를 받지 못하는 Fragment 클래스 생성자 대신 인자를 받는다.
	 * @param fragmentId 생성될 인스턴스의 고유 아이디
	 * @param kind 곡들의 분류
	 * @param name 곡들의 세부 분류
	 * @return FragSongList의 인스턴스
	 */
	public static SongListFragment newInstance(OBJECTID id, String kind, String name) {
		SongListFragment instance = new SongListFragment();
		
		Bundle bundle = new Bundle();
		bundle.putString(KEY_ID,   id.name());
		bundle.putString(KEY_KIND, kind);
		bundle.putString(KEY_NAME, name);
		instance.setArguments(bundle);
		
		return instance;
	} // end newInstance(FragmentId, String, String)
	
	///////////
	//////////
	/////////   getter
	
	/**
	 * 이 인스턴스의 고유 아이디를 리턴한다.
	 * @return 이 인스턴스의 고유 아이디
	 */
	public OBJECTID getFragmentId() {
		return OBJECTID.valueOf(getArguments().getString(KEY_ID));
	} // end getFragmentId
	
	/**
	 * 곡들의 분류를 리턴한다.
	 * @return 곡들의 분류
	 */
	public String getKind() {
		return getArguments().getString(KEY_KIND);
	} // end getKind
	
	/**
	 * 곡들의 세부 분류를 리턴한다.
	 * @return 곡들의 세부 분류
	 */
	public String getName() {
		return getArguments().getString(KEY_NAME);
	} // end getName
	
	///////////
	//////////
	/////////   methods
	
	/**
	 * 프래그먼트를 포함하는 액티비티의 제목을 설정하기 위한 문자열을 반환하는 메서드.
	 * @return 제목으로 사용될 수 있는 문자열
	 */
	public String getTitleForWindow() {
		String kind = getKind();
		
		if(kind.equals(MPApp.TAG_ARTIST)) {
			return FORTITLE_ARTIST + getName();
		} else if(kind.equals(MPApp.TAG_GENRE)) {
			return FORTITLE_GENRE + getName();
		} else if(kind.equals(MPApp.TAG_COMPOSER)) {
			return FORTITLE_COMPOSER + getName();
		}
		
		return FORTITLE_ALLSONG;
	}
	
	/**
	 * 리스트를 생성한다.
	 */
	protected void setList() {
		String kind = getKind();
		String name = getName();
		
		String[] columns = new String[] { MPApp.TAG_ID, MPApp.TAG_TITLE, MPApp.TAG_ARTIST };
	    if(kind.equals(MPApp.TAG_ARTIST) || kind.equals(MPApp.TAG_ALBUMARTIST)) {
	    	columns[2] = MPApp.TAG_ALBUM;
	    } // end if

	    Cursor cursor = getActivity().getContentResolver().query(Audio.Media.EXTERNAL_CONTENT_URI,
	    		                                                 columns,
	    		                                                 MusicUtility.makeWhere(kind, name),
	    		                                                 null,
	     		                                                 MPApp.TAG_TITLE);
	    
	    SongListMCAdapter adapter = new SongListMCAdapter(getActivity(), cursor);
	    if(kind.equals(MPApp.TAG_ARTIST) || kind.equals(MPApp.TAG_ALBUMARTIST)) {
	    	adapter.setViewState(SongListMCAdapter.VIEWSTATE.TITLE_ALBUM);
	    } else {
	    	adapter.setViewState(SongListMCAdapter.VIEWSTATE.TITLE_ARTIST);
	    } // end if
	    
	    setListAdapter(adapter);
	} // end setList
	
	///////////
	//////////
	/////////   event listener & callback method
	
	/**
	 * 리스트가 눌렸을 때의 콜백 메소드
	 */
	@Override
	public void onListItemClick(ListView l, View view, int position, long id) {
		BaseListFragment.OnListItemClickListener lintener = (BaseListFragment.OnListItemClickListener)getActivity();
		lintener.onItemClick(getFragmentId(), l, view, position, id);
	} // end onListItemClick
} // end FragSongList